﻿using System;
using System.Data;
using System.Text;
using System.Xml.Serialization;
using System.IO;
using Negocio.Generico;
using System.Collections.Generic;

namespace Negocio.View.Base
{
    /// <summary>
    /// Descripción breve de BaseView
    /// </summary>
    public abstract class ViewBase
    {
        #region Propiedades

        /// <summary>
        /// Retorna un tipo string
        /// </summary>
        protected Type GetTypeString
        {
            get
            {
                return Type.GetType("System.String");
            }
        }

        /// <summary>
        /// Retorna un tipo Int32
        /// </summary>
        protected Type GetTypeInt32
        {
            get
            {
                return Type.GetType("System.Int32");
            }
        }

        /// <summary>
        /// Retonra un Int32 con posiblidad de valores nulos.
        /// </summary>
        protected Type GetTypeSqlInt32
        {
            get
            {
                return typeof(System.Data.SqlTypes.SqlInt32);
            }
        }

        /// <summary>
        /// Retorna un tipo DateTime
        /// </summary>
        protected Type GetTypeDateTime
        {
            get
            {
                return Type.GetType("System.DateTime");
            }
        }

        /// <summary>
        /// Retorna un tipo DateTime. Permite valores nulos
        /// </summary>
        protected Type GetTypeSqlDateTime
        {
            get
            {
                return typeof(System.Data.SqlTypes.SqlDateTime);
            }
        }

        /// <summary>
        /// Retorna un tipo chars
        /// </summary>
        protected Type GetTypeChar
        {
            get
            {
                return Type.GetType("System.Char");
            }
        }

        /// <summary>
        /// Retorna un tipo boolean
        /// </summary>
        protected Type GetTypeBoolean
        {
            get
            {
                return Type.GetType("System.Boolean");
            }
            
        }

        /// <summary>
        /// Retorna un tìpo array de bytes
        /// </summary>
        protected Type GetTypeByteArray 
        {
            get 
            {
               return Type.GetType("System.Byte[]");
            }
        }

        /// <summary>
        /// Retorna un tipo Double en el que se embebe el tipo float 
        /// que es el unico que se emplea en esta apliccion
        /// </summary>
        protected Type GetTypeDouble
        {
            get 
            {
                return Type.GetType("System.Double");
            }
        }

        /// <summary>
        /// Retorna un Double nullable
        /// </summary>
        protected Type GetTypeSqlDouble 
        {
            get 
            {
                return typeof(System.Data.SqlTypes.SqlDouble);
            }
        }

        #endregion

        #region Métodos para introducir a la Base de Datos

        /// <summary>
        /// Devuelve una cadena o DBNull según el parametro pasado.
        /// </summary>
        /// <param name="nullable">cadena de texto</param>
        /// <returns>Nulo o la cadena</returns>
        protected object GetSqlValue(string nullable)
        {
            if (nullable == null)
            {
                return System.Data.SqlTypes.SqlString.Null;
            }
            else
            {
                return (string)nullable;
            }
        }

        /// <summary>
        /// Devuelve un entero o DBNull según el parametro pasado.
        /// </summary>
        /// <param name="nullable">Entero nullable</param>
        /// <returns>Nulo o el entero</returns>
        protected object GetSqlValue(int? nullable)
        {
            if (nullable == null)
            {
                return System.Data.SqlTypes.SqlInt32.Null;
            }
            else
            {
                return (int)nullable;
            }
        }

        /// <summary>
        /// Devuelve un DateTime o DBNull según el parametro pasado.
        /// </summary>
        /// <param name="nullable">DateTime nullable</param>
        /// <returns>Nulo o el entero</returns>
        protected object GetSqlValue(DateTime? nullable)
        {
            if (nullable == null)
            {
                return System.Data.SqlTypes.SqlDateTime.Null;
            }
            else
            {
                return (DateTime)nullable;
            }
        }

        /// <summary>
        /// Devuelv eun Double o DBNUll segun el parametro pasado
        /// </summary>
        /// <param name="nullable">Double nullable</param>
        /// <returns>Nulo o el valor double</returns>
        protected object GetSqlValue(Double? nullable) 
        {
            if (nullable == null)
            {
                return System.Data.SqlTypes.SqlDouble.Null;
            }
            else
            {
                return (Double)nullable;
            }
        }



        #endregion

        #region Funciones para la gestion de los listados genericos

        /// <summary>
        /// Funcion que devuelve un dataset despues de obtener el valor de la lista de dtos
        /// </summary>
        /// <param name="listvalue">lista de parametros para poder tener los valores</param>
        /// <returns></returns>
        public DataSet ConvertGenericsListToDataSet(List<IDTO> listvalue)
        {
            StringBuilder sb = new StringBuilder();
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<IDTO>));
            StringWriter sw = new StringWriter(sb);
            xmlSerializer.Serialize(sw, listvalue);
            StringReader stream = new StringReader(sb.ToString());
            DataSet ds = new DataSet();
            ds.ReadXml(stream);
            return ds;
        }


       

        #endregion

    }
}
